查看原文
其他

[Excel]抽取杂乱文本中的数字

2017-06-20 效率火箭 效率火箭

有的时候,我们会得到一些嵌有数值的文本信息。为了处理这些信息,我们不得不要绞尽脑汁提取其中的数值。若格式统一,那还好办,若格式千奇百怪……


比如这样:

是不是瞬间有一万匹草泥马飘过……


构思想法

很显然,这一组信息并没有明显的规律。因此,想要提取出其中的数字,必须按照两步走:

  1. 找到第一个数字字符在字符串中的位置

  2. 找出数字字符的长度


找出第一个数字字符的位置

找到第一个数字字符的位置,换句话来形容的话,就是要找到:字符为0~9,在整个字符串中的最小位置

这里我先定义了两个区域分别为IstNumbers——包含0~9这10个字符,以及IstDigits——包含0~9以及小数点和逗号。稍后,火箭君会详细解释一下,这样定义的具体考虑。

在C4单元格键入公式:

=MIN(IFERROR(FIND(lstNumbers,B4),""))

然后按下CTRL+SHIFT+Enter,完成数组公式的输入。

  • FIND(IstNumbers,B4) 部分

这个部分公式,是逐一计算0~9这些数字在B4文本中出现的位置。一旦在文本中找到这个数字,则直接返回一个字符位置;否则返回一个错误值。以B4单元格749000 RMB为例,其返回的数组为:

{4;#VALUE!;#VALUE!;#VALUE!;2;#VALUE!;#VALUE!;1;#VALUE!;3}

意为0出现在第四个位置,4出现在第二个位置,7出现在第一个位置,9出现在第三个位置,其他数字没有出现。

  • IFERROR(...,"") 部分

这个函数,则将刚才找到的错误值全部转换为空值,返回值变为:

{4;"";"";"";2;"";"";1;"";3}

  • {=MIN(...)}部分

这个函数则返回了,刚才处理过的数组中最小的值,也就是1。这也就是数字字符的起始位置。

当然,由于考虑到我们要比对寻找多个字符,因此用数组计算方式才正确。


找到数字字符的长度

由于考虑到原数据中,还存在有逗号、小数点这样的表达形式,因此火箭君在上文中定义了IstDigits这个区域。

在D4中键入公式:

=SUMPRODUCT(COUNTIF(lstDigits,MID(B4,ROW($A$1:$A$200),1)))

  • COUNTIF(lstDigits, MID(…)) 部分

检查B4文本中每一字符在IstDigits中是否出现,是为1,否为0。而整个B4文本总长不超过200个字符。因此返回值为:

{1;1;1;1;1;1;0;0;0;0;0;0;0;…}

也就是B4中,仅有前六位为数字或者逗号、小数点。

  • SUMPRODUCT(…) 部分

由于上一步的返回值是一个数组,因此使用sumproduct进行求和。在这里返回为6。

数字抓取的结果

仍然有两种格式无法被上述公式所认可,不知道小伙伴你,会有什么想法呢?也欢迎在火箭君的公众号后台留言,说说你的处理想法。

当然,如果你对具体公式还有疑问,可以在公众号里回复“数字抓取”,我将推送给你我的工作表!





相关文章:

[Excel]原来文字数字混搭的数据也能进行排序

[Excel]快速追踪数据表更改的蛛丝马迹,你也行!

[Excel]5招快速拯救杂乱无章的日期格式



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存